"use strict";

/**
 * 校验是否为银行卡号
 *
 * @since 1.1.0
 * @category 正则
 * @param {string} str 需要校验的字符串.
 * @param {object} config 配置参数.
 * @param {boolean} config.isDetail 是否返回详细信息, 为true时返回CheckResult, false时返回boolean 默认: false.
 *
 * @returns { boolean|CheckResult } 校验结果 或 结果对象.
 *
 * @typedef {object} CheckResult
 * @property {boolean} status 校验结果
 * @property {string} errorMsg 错误提示
 * @property {RexExp} reg 校验数据使用的RexExp对象
 *
 * @example
 *
 * z.isBankCard('6220101010101010')
 * // => true
 * z.isBankCard('6220101010101010', { isDetail: true })
 * // { status: true, errorMsg: '', reg: /^(62|18|19|20|21|22|23|24|25|26|27|30|31|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|58|60|65|84|87|88|89|94|95|96|97|98|99)\d{14,17}$|^3[47]\d{13}$|^4\d{12}(\d{3})?$|^5[1-5]\d{14}$|^6(?:011|5\d{2})\d{12}$|^(?:2131|1800|35\d{3})\d{11}$|^65[2-9]d{12}|650[0-9]d{11}|6511d{12}|3[4-9]d{15}$/ }
 *
 */
function isBankCard(str) {
  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
      _ref$isDetail = _ref.isDetail,
      isDetail = _ref$isDetail === void 0 ? false : _ref$isDetail;

  var rt = {
    status: false,
    errorMsg: ''
  };

  if (typeof str !== 'string') {
    throw new Error('类型错误');
  } // 银行卡号正则


  var regs = ['^(62|18|19|20|21|22|23|24|25|26|27|30|31|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|58|60|65|84|87|88|89|94|95|96|97|98|99)\\d{14,17}$', // 中国大陆地区银行卡号
  '^3[47]\\d{13}$', // 美国运通卡
  '^4\\d{12}(\\d{3})?$', // Visa卡
  '^5[1-5]\\d{14}$', // MasterCard卡
  '^6(?:011|5\\d{2})\\d{12}$', // Discover卡
  '^(?:2131|1800|35\\d{3})\\d{11}$', // JCB卡
  '^65[2-9]d{12}|650[0-9]d{11}|6511d{12}|3[4-9]d{15}$' // RuPay卡
  ];
  rt.reg = new RegExp(regs.join('|'));

  if (rt.reg && !rt.reg.test(str)) {
    rt.errorMsg = '格式错误!';
  } else {
    rt.status = true;
  }

  return isDetail ? rt : rt.status;
}

module.exports = isBankCard;